﻿using System;
using System.Text;

namespace Storytelling.Negocio.Rolador
{
    public sealed class ParadaDados
    {
        private static Random random;

        private StringBuilder jogada;
        private int sucessos;

        public int Sucessos
        {
            get { return sucessos; }
        }

        static ParadaDados()
        {
            random = new Random();
        }

        public ParadaDados(int totalDados, bool sistemaAntigo, bool anuladorSucesso, Dificuldade dificuldade, Explosao explosao)
        {
            jogada = new StringBuilder();
            sucessos = 0;

            if (!sistemaAntigo && totalDados <= 0)
            {
                totalDados = 0;

                int dado = LancarDado;

                FormatarDado(dado, dado < 10 && dado > 1);

                if (dado == 10)
                {
                    sucessos++;
                    totalDados++;
                }
                else if (dado == 1)
                {
                    FalhaCritica();
                }
            }

            bool nenhumSucesso = true;
            int valorDificuldade = (int) dificuldade;
            int valorExplosao = (int) explosao;

            while (totalDados > 0)
            {
                int dado = LancarDado;

                if (dado >= valorDificuldade)
                {
                    sucessos++;
                    nenhumSucesso = false;
                }

                if (dado >= valorExplosao)
                {
                    totalDados++;
                }
                else if (anuladorSucesso && dado == 1)
                {
                    sucessos--;
                }

                FormatarDado(dado, totalDados == 1);

                totalDados--;
            }

            if (sistemaAntigo && nenhumSucesso && sucessos < 0)
            {
                FalhaCritica();
            }
        }

        private int LancarDado
        {
            get
            {
                return random.Next(1, 11);
            }
        }

        private void FalhaCritica()
        {
            jogada.Clear();
            jogada.Append("FALHA CRÍTICA!");
        }

        private void FormatarDado(int dado, bool ultimo)
        {
            jogada.Append(dado);

            if (ultimo)
            {
                jogada.Append(".");
            }
            else
            {
                jogada.Append(",");
            }
        }

        public override string ToString()
        {
            return jogada.ToString();
        }
    }
}
